package cn.lg.soar.system.biz.modules.monitor.service;


import cn.lg.soar.common.util.data.DataUtil;
import cn.lg.soar.system.api.model.AuthProps;
import cn.lg.soar.system.api.model.LoginInfo;
import cn.lg.soar.system.biz.modules.monitor.entity.RefreshToken;
import com.baomidou.mybatisplus.extension.service.IService;

import java.io.Serializable;
import java.util.Collection;
import java.util.Set;

/**
 *
 * @author luguoxiang
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface IRefreshTokenService extends IService<RefreshToken> {

    /**
     * 根据用户id删除 RefreshToken
     * @param userId
     * @return
     */
    Set<String> removeByUserId(Serializable userId);

    /**
     * 根据用户id和设备类型删除 RefreshToken
     * @param userId
     * @param clientType
     * @return
     */
    Set<String> removeByUserId(Serializable userId, Integer clientType);

    /**
     * 创建token
     * @param loginInfo
     * @param expires
     * @return
     */
    String create(LoginInfo loginInfo, long expires);

    /**
     * 创建token
     * @param loginInfo
     * @param rememberMe
     * @return
     */
    String create(LoginInfo loginInfo, boolean rememberMe);

    /**
     * 创建token
     * @param userId
     * @param expires
     * @return
     */
    String create(Long userId, long expires);

    /**
     * 创建token
     * @param userId
     * @param rememberMe
     * @return
     */
    String create(Long userId, boolean rememberMe);

    /**
     * 清除token
     */
    void clear();

    /**
     * 清除token
     * @param userId
     * @param clientTypes
     */
    void clear(Long userId, Collection<Integer> clientTypes);

    /**
     * 清除token
     * @param userId
     * @param clientTypes
     */
    default void clear(Long userId, Integer[] clientTypes) {
        clear(userId, DataUtil.arrayToList(clientTypes));
    }

    /**
     * 刷新token
     * @param refreshToken
     * @return
     */
    String refresh(String refreshToken);

    /**
     * 刷新token
     * @param payload
     * @return
     */
    String refresh(Object[] payload);

    /**
     * 验证刷新token
     * @param refreshToken
     * @return
     */
    RefreshToken verify(String refreshToken);

    /**
     * 优化（剔除失效的数据）
     */
    void optimize();

    AuthProps getAccessTokenConfig();

}
